home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Environments / CGIshell 1.3.2 / Pocket 6.5 / Source / Interface.txt < prev    next >
Text File  |  1994-12-10  |  18KB  |  633 lines

  1. ; Interface.txt -- interface routines  3:37:12 PM  2/4/87
  2. ; Fri Jan 22, 1988 12:52:12 version 0.3
  3. ; Fri Feb 12, 1988 13:35:10 3+ menus
  4. ; Wed Mar 30, 1988 13:37:36 'newer' routine
  5. ; Thu Apr 07, 1988 16:00:59 nested loads
  6. ; Mon Apr 18, 1988 14:06:09 restructure variables, echo
  7. ; Sun May 01, 1988 10:38:11 fix emptyFS to skip nil handles
  8. ; Mon May 27, 1991 17:41:00 use wne based event loop and zoomin&out handlers
  9. ; Fri May 30, 1991 05:09:00 handler for "high level events"
  10. ; Sun Apr 12, 1992 22:48:00 move tib and userVars from ainterp
  11. ; Sun Apr 19, 1992 23:24:00 apple events
  12. ; Fri Jan 22, 1993 19:28:00 fix KEYEVT
  13. ; Sun Jul 04, 1993 07:55:00 0.6.3
  14. ; Sat Dec 10, 1994 14:00:00 fix AppleScript error 0.6.4
  15.  
  16. theWindow:    DC.L    0        ; pointer  ( 0 +md )
  17.     WContRect:    DC.W    0,0        ; ( 4 +md )
  18.     WSize:    DC.W    WHeight,WWidth    ; ( 8 +md )
  19.  
  20. Activate:    DC.W    drop-Base    ; ( 12 +md )
  21. Update:        DC.W    curs-Base    ; ( 14 +md )
  22. Button:        DC.W    beep-Base    ; ( 16 +md )
  23. YourMenu:    DC.W    menus-Base    ; ( 18 +md )
  24. Runner:        DC.W    null-Base    ; ( 20 +md )
  25. Closer:        DC.W    bye-Base    ; ( 22 +md )
  26. About:        DC.W    doabout-base    ; ( 24 +md )
  27. Newer:        DC.W    null-base    ; ( 26 +md )
  28. Echo:        DC.W    -1        ; ( 28 +md )
  29.  
  30. AppleMenu:    DC.L    0        ; ( 30 +md )
  31. FileMenu:    DC.L    0        ; ( 34 +md )
  32. EditMenu:    DC.L    0        ; ( 38 +md )
  33.  
  34. TextO:        DC.L    0        ; TextOffset ( 42 +md )
  35. TextE:        DC.L    0        ; TextEnd
  36. TextH:        DC.L    0        ; TextHandle
  37. FStack:        DCB.L    5,0        ; text block handles
  38. FOfsets:    DCB.L    5,0        ; text block offsets
  39. FEnds:        DCB.L    5,0        ; text block ends
  40. FSPtr:        DC.W    -4        ; file stack pointer
  41.         
  42. Events:        DC.W    Null-Base    ;  0. Null Event ( 116 +md )
  43.         DC.W    BDEvt-Base    ;  1. Mouse button down ( 118 +md )
  44.         DC.W    Null-Base    ;  2. Mouse button up ( 120 +md )
  45.         DC.W    KeyEvt-Base    ;  3. Key down ( 122 +md )
  46.         DC.W    Null-Base    ;  4. Key up ( 124 +md )
  47.         DC.W    KeyEvt-Base    ;  5. Auto key ( 126 +md )
  48.         DC.W    UDEvt-Base    ;  6. Update window ( 128 +md )
  49.         DC.W    Null-Base    ;  7. Disk inserted event ( 130 +md )
  50.         DC.W    ActEvt-Base    ;  8. Activate window ( 132 +md )
  51.         DC.W    Null-Base    ;  9. reserved ( 134 +md )
  52.         DC.W    doAEvent-Base    ; A. do AppleEvent ( 136 +md )
  53.         DC.W    Null-Base    ; B. I/O driver ( 138 +md )
  54.         DC.W    Null-Base    ; C. Undefined1 ( 140 +md )
  55.         DC.W    Null-Base    ; D. Undefined2 ( 142 +md )
  56.         DC.W    Null-Base    ; E. Undefined3 ( 144 +md )
  57.         DC.W    MFEvt-Base    ; F. mouse & suspend/resume ( 146 +md )
  58.  
  59. EventRecord:
  60.   What:        DC.W    0        ; WhatEvent# ( 148 +md )
  61.   Message:    DC.W    0        ; key code, wptr, etc. ( 150 +md )
  62.    ASCII:    DC.W    0        ; ASCII code  ( 152 +md )
  63.   When:        DC.L    0        ; Ticks since startup ( 154 +md )
  64.   Where:                ; Mouse coordinates ( 158 +md )
  65.    V:        DC.W    0
  66.    H:        DC.W    0
  67.   Modify:    DC.W    0        ; State of modifier keys ( 162 +md )
  68.  
  69. WWindow:    DC.L    0        ; WindowPtr from FindWindow ( 164 +md )
  70. Clicks:        DC.W    Null-Base    ; InDesk ( 168 +md )
  71.         DC.W    MenuBar-Base    ; InMenu Bar ( 170 +md )
  72.         DC.W    DARgn-Base    ; InSystem Window ( 172 +md )
  73.         DC.W    ContentRgn-Base    ; InContent region ( 174 +md )
  74.         DC.W    DragRgn-Base    ; InDrag region ( 176 +md )
  75.         DC.W    Null-Base    ; InGrow region ( 178 +md )
  76.         DC.W    CloseRgn-Base    ; ByeByeBox ( 180 +md )
  77.         DC.W    beep-base    ; inZoomIn ( 182 +md )
  78.         DC.W    beep-base    ; inZoomOut ( 184 +md )
  79.  
  80. MFlag:        DC.W    0        ; true if multitasking ( 186 +md )
  81. AEvents:    DC.W    ae1-base    ; address of first AEentry ( 188 +md )
  82. AError:        DC.W    drop-base    ; process AEerror number ( 190 +md )
  83. KFlag:        DC.W    0        ; key flag  ( 192 +md )
  84. doneFlag:    DC.W    0        ; done flag  ( 194 +md )
  85. openFlag:    DC.W    0        ; open flag  ( 196 +md )
  86. AEReply:    DC.L    0        ; Apple Event Reply ( 198 +md )
  87. AEEventRecord:    DC.L    0        ; Apple Event Event Record ( 202 +md )
  88.  
  89. ; addresses beyond this are not documented relative to +md
  90. oldIdle:    DC.W    0
  91. Desc:        DC.L    0,0
  92. Scratch:    DC.L    0
  93. SaveAERegs:    DC.L    0,0,0,0        ; Dict,DP,IS,PS
  94. BigRect:    DC.W    $8000,$8000,$7FFF,$7FFF        ; for dragging
  95.  
  96.     ae1:    DC.L    'aevt'
  97.         DC.L    'oapp'
  98.         DC.W    aenull-base
  99.         DC.W    ae2 -base
  100.     ae2:    DC.L    'aevt'
  101.         DC.L    'odoc'
  102.         DC.W    aeopen-base
  103.         DC.W    ae3 -base
  104.     ae3:    DC.L    'aevt'
  105.         DC.L    'pdoc'
  106.         DC.W    aenull-base
  107.         DC.W    ae4 -base
  108.     ae4:    DC.L    'aevt'
  109.         DC.L    'quit'
  110.         DC.W    aebye-base,0
  111.  
  112. Menus:        DC.W    Fmenu-base
  113.         DC.W    Emenu-base
  114.     Fmenu:    DC.W    open-base    ; Open…
  115.         DC.W    null-base    ; -
  116.         DC.W    csave-base    ; Save
  117.         DC.W    mon-base    ; Debug
  118.         DC.W    null-base    ; -
  119.         DC.W    beep-base    ; Print
  120.         DC.W    null-base    ; -
  121.         DC.W    by-base        ; Quit
  122.     Emenu:    DC.W    beep-base    ; Undo
  123.         DC.W    null-base    ; -
  124.         DC.W    beep-base    ; Cut
  125.         DC.W    beep-base    ; Copy
  126.         DC.W    paste-base    ; Paste
  127.         DC.W    beep-base    ; Clear
  128.  
  129. ; addresses beyond this are relative to tib
  130. TermBuf        DCB.B    82,32        ; command line buffer  ( 0 tib + )
  131.  
  132. ; User variable data
  133. StackSize:    DC.W    2048        ; variable stack size  ( 82 tib + )
  134. IntA7:        DC.L    0        ; initial value for A7  ( 84 tib + )
  135. Rzero:        DC.L    0        ; value for A7 after linking  ( 88 tib + )
  136. Szero:        DC.L    0        ; bottom of stack  ( 92 tib + )
  137. Form:        DC.L    $FFFF0007    ; decaform record  ( 96 tib + )
  138. Expand:        DC.L    0        ; hold address of expand routine  ( 100 tib + )
  139. FreePt:        DC.W    dictend-Base    ; initial compile point freespace  ( 104 tib + )
  140. FreeSz:        DC.W    base+32767-dictend    ; max headroom  ( 106 tib + )
  141. DictPt:        DC.W    task-theLink    ; initial dict. search start  ( 108 tib + )
  142. NBase:        DC.W    10        ; the numeric radix  ( 110 tib + )
  143. Held:        DC.W    0        ; the HLD data  ( 112 tib + )
  144. DoesAddr:    DC.L    0        ; "does>" jump address  ( 114 tib + )
  145. fcolon:        DC.B    0        ;   compile mode  ( 118 tib + )
  146. fimmed:        DC.B    0        ;   immediate flag  ( 119 tib + )
  147. fneg:        DC.B    0        ;   negative flag  ( 120 tib + )
  148. fint:        DC.B    $80        ;   interactive mode  ( 121 tib + )
  149. fmacro:        DC.W    0        ;   macro flag+filler  ( 122 tib + )
  150.  
  151.  
  152. ; ----- Startup Code -----
  153.  
  154. MacStart:    ; load the menus, setup a window and create a data block
  155.     MOVEQ    #1,D3
  156.     @0: CLR.L    -(SP)            ; room
  157.     MOVE    D3,-(SP)        ; Push menu ID
  158.     _GetRMenu            ; Get menu from resource.
  159.     MOVE    D3,D0
  160.     SUBQ    #1,D0
  161.     ASL    #2,D0
  162.     LEA     AppleMenu,A0        ; menu handle data area
  163.     MOVE.L    (SP),0(A0,D0.W)        ; Save it.
  164.     CLR    -(SP)            ; Push a 0 for append.
  165.     _InsertMenu
  166.     ADDQ    #1,D3
  167.     CMP    #4,D3
  168.     BNE.S    @0            ; do the next menu
  169.  
  170.     MOVE.L    AppleMenu,-(SP)
  171.     MOVE.L    #'DRVR',-(SP)        ; Load all DRVR resource types.
  172.     _AddResMenu            ; Add the DA's.
  173.     _DrawMenuBar
  174.  
  175.     ; create a window
  176.     CLR.L    -(SP)            ; make room for the new window pointer
  177.     MOVE    #128,-(SP)        ; WIND ID
  178.     CLR.L    -(SP)            ; put it on the heap
  179.     MOVE.L    #-1,-(SP)        ; behind none
  180.     MOVE.L    #'qd  ',-(PS)
  181.     JSR    qgestalt-base(BP)
  182.     TST    (PS)+
  183.     BEQ.S    @1
  184.     MOVE.L    (PS)+,D0
  185.     CMP    #$100,D0
  186.     BLT.S    @1
  187.     _GetNewCWindow
  188.     BRA.S    @2
  189.     @1:    _GetNewWindow
  190.     @2:    MOVE.L  (SP),theWindow-base(BP)
  191.     MOVE.L    (SP),-(SP)
  192.     MOVE.L    WSize-base(BP),-(SP)
  193.     CLR.W    -(SP)
  194.     _SizeWindow
  195.     MOVE.L    (SP),-(SP)
  196.     _ShowWindow
  197.     _SetPort
  198.     
  199.     ; create a temp scrap holder
  200.     MOVE.L    #10,D0            ; this is just a size
  201.     _NewHandle            ; create a handle
  202.     MOVE.L    A0,TextH-base(BP)    ; to hold clipboard data
  203.  
  204.     ; Check for multitasking environment
  205.     CLR    MFlag-base(BP)        ; set MFlag to 0
  206.     MOVE.W    #$A89F, D0        ; _Unimplemented
  207.     _GetTrapAddress            ; NGetTrapAddress
  208.     MOVE.L    A0,D1
  209.     MOVE.W    #$A860,D0        ; _WaitNextEvent
  210.     _GetTrapAddress            ; NGetTrapAddress
  211.     CMP.L    A0,D1
  212.     BEQ.S    @3            ; no multitasking
  213.     MOVE.W    #$100,MFlag-base(BP)    ; set multitasking flag
  214.  
  215.     ; install apple event handlers if running system 7
  216.     @3:    MOVE.L    #'evnt',-(PS)
  217.     JSR    QGestalt-base(BP)
  218.     TST    (PS)+            ; check for gestalt
  219.     BEQ.S    @5            ; no gestalt, just return
  220.     SUBQ.L    #1,(PS)+        ; check for apple events present
  221.     BMI.S    @5            ; no apple events, just return * 6.4 fix
  222.     MOVE    AEvents-base(BP),D0    ; start rel addr of the events list
  223.     @4:    LEA    0(BP,D0.W),A4        ; start addr of an item
  224.     CLR    -(A7)            ; result
  225.     MOVE.L    (A4),-(A7)        ; push event class
  226.     MOVE.L    4(A4),-(A7)        ; push event selector
  227.     MOVE    8(A4),D0        ; get rel addr of handler
  228.     PEA    0(BP,D0.W)        ; push abs addr of handler
  229.     PEA    (BP)            ; push refcon
  230.     CLR    -(A7)            ; not syshandler
  231.     _AEInstallEvent        ; INSTALL EACH EVENT IN THE LIST
  232.     TST    (A7)+            ; drop result
  233.     MOVE    10(A4),D0        ; get rel addr of next item
  234.     BNE.S    @4            ; a zero indicates done
  235.  
  236.     @5:    RTS
  237.  
  238.  
  239. ; ----- Event Loop ------
  240.  
  241. doDone:    MOVEA.L    intA7-base(BP),A7    ; *** quit PocketForth ***
  242.     RTS
  243.  
  244. doOpen:    CLR    openFlag-base(BP)
  245.     JMP    doload-base(BP)
  246.  
  247. NextEvent:
  248.     CLR    KFlag-base(BP)        ; clear the key flag
  249.     CLR    -(SP)            ; turn all menus white
  250.     _HiLiteMenu
  251.  
  252.     TST    doneFlag-base(BP)
  253.     BNE.S    dodone
  254.  
  255.      TST    openFlag-base(BP)
  256.      BNE.S    doopen
  257.  
  258.     MOVE    Runner-base(BP),D0
  259.     JSR    0(BP,D0.W)        ; run the idle routine
  260.  
  261.     clr.l    -(sp)
  262.     subq    #1,(sp)
  263.     PEA    EventRecord-base(BP)    ; event record to be filled
  264.  
  265.     TST    MFlag-base(BP)        ; running multitasking?
  266.     BNE.S    @1            ; if not, do SystemTask/GetNextEvent
  267.  
  268.     _SystemTask            ; handle DA's, etc.
  269.     _GetNextEvent            ; fill the event record
  270.     BRA.S    @2
  271.  
  272.     @1:    CLR.L    -(SP)            ; 0 sleep ticks
  273.     CLR.L    -(SP)            ; nil mouse region
  274.     _WaitNextEvent            ; get multitasking event
  275.  
  276.     @2:    TST    (SP)+            ; Is this an event?
  277.     BEQ.S    rdr            ;   no  this is a non-event
  278.  
  279.     MOVE    What-base(BP),D0    ; check the event number
  280.     CMPI    #23,D0            ; is it a HighLevelEvent?
  281.     BNE.S    @3
  282.     MOVEQ    #10,D0            ; remap HLEs to event 10 (IM VI5-12)
  283.  
  284.     @3:    LEA    Events-base(BP),A0
  285.   hop1:    ADD    D0,D0            ; Calculate and jump to the ...
  286.     MOVE    0(A0,D0.W),D0        ; ... rel addr of the routine ... 
  287.   hop2:    JMP    0(BP,D0.W)        ; ... in the Events list.
  288.  
  289. ; -- Mouse Down Event --
  290.  
  291. BDEvt:    CLR    -(SP)            ; Result of find window
  292.     MOVE.L    Where-base(BP),-(SP)    ; Mouse point of click.
  293.     PEA    WWindow-base(BP)    ; Var. for pointer of clicked wind.
  294.     _FindWindow            ; Returns window region code ...
  295.     CLR.L    D0            ; ... (see p. WM-27 in IM).
  296.     MOVE    (SP)+,D0        ; Pop part number
  297.     LEA    Clicks-base(BP),A0    ; clicks is an array of rel.addrs
  298.     BRA.S    hop1
  299.  
  300.     MenuBar:
  301.     CLR.L    -(SP)            ; Make room for menu choice data.
  302.     MOVE.L    Where-base(BP),-(SP)    ; Mouse coordinates of click.
  303.     _MenuSelect            ; Get the selected Menu data.
  304.     MOVE.L    (SP)+,-(PS)        ; menu ID and item to pstack.
  305.     bra.s    domenu
  306.         
  307.     DARgn:
  308.     PEA    EventRecord-base(BP)
  309.     MOVE.L    WWindow-base(BP),-(SP)
  310.     _SystemClick
  311.     RTS
  312.     
  313.     DragRgn:
  314.     MOVE.L    WWindow-base(BP),-(SP)    ; push The Window Pointer
  315.     MOVE.L    Where-base(BP),-(SP)    ; push The Mouse Coordinates
  316.     PEA    BigRect-base(BP)    ; The drag boundry limits
  317.     _DragWindow            ; Drag it
  318.    rdr:    RTS
  319.  
  320.     CloseRgn:
  321.     CLR    -(SP)
  322.     MOVE.L    WWindow-base(BP),-(SP)
  323.     MOVE.L    Where-base(BP),-(SP)
  324.     _TrackGoAway
  325.     MOVE    (SP)+,D0
  326.     BEQ.S    rdr
  327.     by:    MOVE    Closer-base(BP),D0    ; inital value: bye-base
  328.     BRA.S    hop2
  329.  
  330.     ContentRgn:                ; select the clicked in window.
  331.     MOVE.L    WWindow-base(BP),-(SP)
  332.     _SelectWindow
  333.     MOVE    Button-base(BP),D0    ; inital value: beep-base
  334.     BRA.S    hop2
  335.  
  336. ; -- Key Down Event --
  337.  
  338. KeyEvt:    _ObscureCursor
  339.     MOVE    Message+2-base(BP),D0
  340.     AND    #$FF,D0            ; D0 has the ASCII code of the key.
  341.     MOVE    Modify-base(BP),D1
  342.     BTST    #8,D1
  343.     BNE.S    CommandKey
  344.     MOVE    D0,kflag-base(BP)
  345.     @0:    RTS
  346.  
  347. ; Menu actions
  348.     CommandKey:                ; handle the menu choices.
  349.     CLR.L    -(SP)            ; Room for menu data.
  350.     MOVE    D0,-(SP)        ; Push ASCII.
  351.     _MenuKey            ; Get the menu data.
  352.     MOVE.L    (SP)+,-(PS)        ; menu ID and item to pstack.
  353.     DoMenu:    ; Determine which menu was used.
  354.     TST    2(PS)            ; is the item number = 0?
  355.     BEQ    twodrop            ; no menu selection, drop data
  356.     
  357.     CMPI    #1,(PS)            ; Is it the Apple menu? ...
  358.     BEQ.S    DoAppleMenu        ; handle this special case
  359.  
  360.     CMPI    #3,(PS)            ; Is it the Edit menu?
  361.     BNE.S    @0            ; the last special case *
  362.     CLR.L    -(SP)            ; Check if it's a DA window
  363.     _FrontWindow
  364.     MOVE.L    (SP)+,A0
  365.     TST    $6C(A0)            ; windowKind(FrontWindow)
  366.     BGE.S    @0            ; negative=dawindow
  367.  
  368.     TST    (PS)+            ; drop the menu id
  369.     CLR    -(SP)
  370.     MOVE    (PS)+,-(SP)        ; push item-1
  371.     SUBQ    #1,(SP)
  372.     _SysEdit            ; do the da edit stuff
  373.     TST    (SP)+
  374.     RTS
  375.  
  376.     @0:    MOVE    YourMenu-base(BP),D0    ; inital value:
  377.     LEA    0(BP,D0.W),A0        ; do a double indexed reference
  378.     MOVE    (PS)+,D0
  379.     SUBQ    #2,D0
  380.     ADD    D0,D0
  381.     MOVE    0(A0,D0.W),D0
  382.      LEA    0(BP,D0.W),A0
  383.     MOVE    (PS)+,D0
  384.     SUBQ    #1,D0
  385.     JMP    hop1-base(BP)
  386.  
  387. DoAppleMenu:
  388.     CLR    (PS)+
  389.     MOVE    (PS)+,D1
  390.     CMP    #1,D1            ; Is it the first item?
  391.     BNE.S    @0
  392.     MOVE    about-base(BP),D0
  393.     JMP    0(BP,D0.W)
  394.     @0:    PEA    WWindow            ; Its a DA
  395.     _GetPort
  396.     MOVE.L    AppleMenu-base(BP),-(SP)
  397.     MOVE    D1,-(SP)
  398.     PEA    (A2)            ; name at here
  399.     _GetItem
  400.     CLR    -(SP)
  401.     PEA    (A2)
  402.     _OpenDeskAcc
  403.     MOVE    (SP)+,D0
  404.     MOVE.L    WWindow-base(BP),-(SP)
  405.     _SetPort
  406.     RTS
  407.  
  408. DoAbout:
  409.     CLR    -(SP)            ; Room for which item number.
  410.     MOVE    #257,-(SP)        ; Resource ID of AboutDialog
  411.     CLR.L    -(SP)
  412.     _Alert                ; About Item
  413.     CLR    (SP)+            ; Don't care which item dismissed.
  414.     RTS
  415.  
  416. ; -- Update Event --
  417.  
  418. UDEvt:    PEA    WWindow-base(BP)
  419.     _GetPort
  420.     MOVE.L    WWindow-base(BP),-(SP)    ; push for _SetPort
  421.     MOVE.L    Message-base(BP),-(SP)    ; push wpointer for _EndUpdate
  422.     MOVE.L    (SP),-(SP)        ; push for _SetPort
  423.     MOVE.L    (SP),-(SP)        ; push for _BeginUpdate
  424.     _BeginUpdate            ; restrict to invalid region
  425.     _SetPort            ; specify this window
  426.     MOVE    Update-base(BP),D0    ; inital value: curs-base
  427.     JSR    0(BP,D0.W)        ; execute the draw routine
  428.     _EndUpdate            ; go back to current cliprgn
  429.     _SetPort
  430.     RTS
  431.  
  432. ; -- Activate Event --
  433.  
  434. ActEvt:    CLR    -(PS)            ; modify has on/off flag in bit 0
  435.     BTST    #0,Modify+1-base(BP)
  436.   act1:    BEQ.S    @0
  437.     SUBQ    #1,(PS)
  438.     @0:    MOVE    Activate-base(BP),D0    ; inital value: drop
  439.     JMP    0(BP,D0.W)
  440.  
  441. ; ---- Activate/Suspend ----
  442.  
  443. MFEvt:    CLR    -(PS)
  444.     TST    message-base(BP)
  445.     BMI    drop
  446.     BTST    #0,message+3-base(BP)
  447.     BRA.S    act1
  448.  
  449. ; ---- High Level Event ----
  450.  
  451. DoAEvent:
  452.     MOVEM.L    Dict/DP/IS/PS,saveAERegs-base(BP) ; send along PF's regs
  453.     CLR    -(SP)
  454.     PEA    eventRecord-base(BP)
  455.     _AEProcessAppleEvent
  456.     MOVE    (SP)+,-(PS)
  457.     BEQ.S    noaer
  458.     MOVE    AError-base(BP),D0
  459.     JMP    0(BP,D0.W)
  460.  noaer:    MOVEM.L    saveAERegs-base(BP),Dict/DP/IS/PS ; update PF's regs
  461.     RTS
  462.  
  463. aepre:    MOVEM.L    (SP)+,A0/A1/BP
  464.     MOVE.L    (SP)+,AEReply-base(BP)        ; store reply
  465.     MOVE.L    (SP)+,AEEventRecord-base(BP)    ; store event record
  466.     CLR    (SP)                ; return no error
  467.     MOVE.L    A1,-(SP)            ; re-stack the return addr
  468.     MOVEM.L    Dict/DP/IS/PS,-(SP)        ; stash the system regs
  469.     MOVEM.L    saveAERegs-base(BP),Dict/DP/IS/PS  ; load PF regs
  470.     JMP    (A0)
  471.  
  472. aenull:    BSR.S    aepre
  473.   aert:    BSR.S    aepost
  474.     RTS
  475.  
  476. aebye:    BSR.S    aepre
  477.     JSR    by-base(BP)
  478.     BRA.S    aert
  479.  
  480. aeopen:    BSR.S    aepre
  481.     BSR.S    aeopn
  482.     BRA.S    aert
  483.  
  484. aepost:    MOVE.L    (SP)+,A0
  485.     MOVEM.L    Dict/DP/IS/PS,saveAERegs-base(BP)  ; save PF regs
  486.     MOVEM.L    (SP)+,Dict/DP/IS/PS    ; restore the system regs
  487.     JMP    (A0)
  488.  
  489. aeopn:    CLR    -(SP)
  490.     MOVE.L    AEEventRecord-base(BP),-(SP)
  491.     MOVE.L    #'----',-(SP)
  492.     MOVE.L    #'list',-(SP)
  493.     PEA    desc-base(BP)
  494.     _AEGetParamDesc
  495.     TST    (SP)+
  496.     BNE.S    @0
  497.     MOVE    runner-base(bp),oldidle-base(BP)
  498.     MOVE    #odocidle-base,runner-base(BP)
  499.     @0:    RTS
  500.  
  501. OdocIdle:    ; Open the document in the idle handler
  502.     MOVE    oldIdle-base(bp),runner-base(BP)    ; reset old handler
  503.     CLR    -(SP)
  504.     PEA    desc-base(BP)
  505.     CLR.L    -(SP)
  506.     ADDQ.L    #1,(SP)            ; index = 1
  507.     MOVE.L    #'fss ',-(SP)        ; desired type
  508.     PEA    108(A2)            ; keyword
  509.     PEA    112(A2)            ; desc type
  510.     PEA    34(A2)            ; data pointer
  511.     MOVE.L    #70,-(SP)
  512.     PEA    104(A2)
  513.     _AEGetNthPtr            ; Get fssPtr at here + 34
  514.     TST    (SP)+            ; test for error
  515.     BNE.S    @1
  516.  
  517.     ; clear out a buffer for working directory param. block
  518.     LEA    40+64+80(A2),A0
  519.     MOVE    #19,D0
  520.     @0:    CLR.L    -(A0)
  521.     DBRA    D0,@0
  522.  
  523.     ; calc working directory here
  524.     MOVE    34(A2),22(A0)        ; -> ioVRefNum
  525.     MOVE.L    36(A2),48(A0)        ; -> ioWDDirID
  526.     _OpenWD
  527.     MOVE    22(A0),-(PS)        ; <- working directory
  528.  
  529.     ADDQ    #1,openFlag-base(BP)
  530.  
  531.     @1:    CLR    -(SP)            ; Be neat
  532.     PEA    desc-base(BP)
  533.     _AEDisposeDesc
  534.     ADDQ.L    #2,SP
  535.     RTS
  536.  
  537. ; Pasting support
  538.  
  539. ClearTermBuf:
  540.     MOVEQ    #76,D0
  541.     LEA    TermBuf-base(BP),IS
  542.     @0:    MOVE.L    #$20202020,0(IS,D0)    ; fill line buffer with blanks
  543.     SUBQ.B    #4,D0
  544.     BGE.S    @0
  545.     RTS
  546.  
  547. EmptyFS: ; clear pending loads from the file stack
  548.     TST    fsptr-base(BP)
  549.     BMI.S    @1
  550.     LEA    fstack-base(BP),A1
  551.     MOVE    fsptr-base(BP),D0
  552.     MOVE.L    0(A1,D0.W),A0        ; A0 has the next load block addr
  553.     MOVE.L    A0,D1
  554.     BEQ.S    @0            ; dont try to dispose of nil handle
  555.     CLR.L    0(A1,D0.W)
  556.     CMPA.L    TextH-base(BP),A0
  557.     BEQ.S    @0
  558.     _DisposHandle
  559.     @0:    SUBQ    #4,fsptr-base(BP)
  560.     BRA.S    emptyfs
  561.     @1:    RTS
  562.  
  563. Paste:    JSR    nocurs-base(BP)
  564.     CLR.L    -(SP)
  565.     MOVE.L    TextH-base(BP),-(SP)    ; handle to the scrap data
  566.     MOVE.L    #'TEXT',-(SP)
  567.     PEA    TextO-Base(BP)
  568.     _GetScrap
  569.     MOVE.L    (SP)+,TextE-base(BP)    ; put the length at TextE
  570.     MOVE.L    TextH-base(BP),A0    ; get a handle to the scrap data
  571.     MOVE.L    (A0),D0            ; derefrence the scrap handle
  572.     MOVE.L    D0,TextO-base(BP)    ; set TextO to start of scrap data
  573.     ADD.L    D0,TextE-base(BP)    ; set TextE to end of scrap data
  574.     _HLock                ; don't let data move during paste
  575.     CLR    fsptr-base(BP)
  576.     MOVE.L    TextH-base(BP),fstack-base(BP)
  577.     MOVE.L    TextO-base(BP),fofsets-base(BP)
  578.     MOVE.L    TextE-base(BP),fends-base(BP)
  579.     go:    CLR.B    fint-base(BP)        ; leave keyboard mode
  580.     JMP    CRet-base(BP)        ; get next line
  581.  
  582. Pasting:    ; GetInput comes here for input when fint-base(BP) is 0
  583.     JSR    ClearTermBuf-base(BP)
  584.     CLR.L    D1            ; clear the character count
  585.     CLR.L    D0            ; and the character
  586.     MOVE.L    TextO-base(BP),A0    ; set the input address
  587.     @0:    MOVE.B    0(A0,D1.W),D0        ; BEGIN  get a character
  588.     cmp.b    #9,d0            ; skip over tabs
  589.     bne.s    @1            ; by substituting spaces
  590.     moveq    #bl,d0            ; in the input stream
  591.     @1:    CMP.B    #CR,D0            ;     is it not a CR?
  592.     BEQ.S    @2
  593.     CMPI.B    #78,D1            ;     or 78 characters in buffer
  594.     BGE.S    @2            ; WHILE
  595.         MOVE.B    D0,0(IS,D1)        ;     stash it into buffer
  596.     ADDQ.B    #1,D1            ;     increment count
  597.     BRA.S    @0            ; REPEAT
  598.     @2:    ADDQ.B    #1,D1            ; increment count
  599.     MOVE.B    #CR,0(IS,D1)        ; stash CR into buffer
  600.     MOVE    D1,-(PS)        ; preserve count for TYPE
  601.     ADD.L    TextO-base(BP),D1
  602.     MOVE.L    D1,TextO-base(BP)
  603.     CMP.L    TextE-base(BP),D1    ; IS the block done (TextO>TextE)?
  604.     BMI.S    tandr            ; just type and return if not.
  605.     MOVE    fsptr-base(BP),D0
  606.     LEA    fstack-base(BP),A0
  607.     MOVE.L    0(A0,D0.W),A0
  608.     _HUnlock            ; unlock the block
  609.     BMI    huh
  610.     CMPA.L    TextH-base(BP),A0
  611.     BEQ.S    @3            ; keep the scrap block
  612.     _DisposHandle            ; dispose of loaded blocks
  613.     BMI    huh
  614.  
  615.     @3:    SUBQ    #4,fsptr-base(BP)    ; pop fstack
  616.     BMI.S    @4            ; branch if no pending loads
  617.  
  618.     MOVE    fsptr-base(BP),D0
  619.     LEA    fofsets-base(BP),A0    ; set TextO to (fofsets+fsptr)
  620.     MOVE.L    0(A0,D0.W),TextO-base(BP)
  621.     LEA    fends-base(BP),A0
  622.     MOVE.L    0(A0,D0.W),TextE-base(BP)
  623.     BRA.S    tandr
  624.  
  625.     @4:    BSET.B    #7,fint-base(BP)    ; set keyboard mode
  626.  tandr:    TST    echo-base(BP)
  627.     BNE.S    @5
  628.     JMP    drop-base(BP)
  629.     @5:    MOVE    #termbuf-base,-(PS)
  630.     JSR    swapp-base(BP)
  631.     JSR    type-base(BP)
  632.     JMP    doCR-base(BP)        ; TIB count TYPE CR ;
  633.